From 65dcdd1ffef7c7eb91ad16441c62c24d06c1b49f Mon Sep 17 00:00:00 2001 From: "smh22@firebug.cl.cam.ac.uk" Date: Thu, 10 Nov 2005 19:32:09 +0100 Subject: [PATCH] Fix page-table dump on PAE with >4GB MFNs. Signed-off-by: Steven Hand --- linux-2.6-xen-sparse/arch/xen/i386/mm/fault.c | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/linux-2.6-xen-sparse/arch/xen/i386/mm/fault.c b/linux-2.6-xen-sparse/arch/xen/i386/mm/fault.c index 269003960e..5d924a0bcf 100644 --- a/linux-2.6-xen-sparse/arch/xen/i386/mm/fault.c +++ b/linux-2.6-xen-sparse/arch/xen/i386/mm/fault.c @@ -208,6 +208,7 @@ fastcall void do_invalid_op(struct pt_regs *, unsigned long); static void dump_fault_path(unsigned long address) { unsigned long *p, page; + unsigned long mfn; preempt_disable(); page = __pa(per_cpu(cur_pgd, smp_processor_id())); @@ -217,20 +218,22 @@ static void dump_fault_path(unsigned long address) p += (address >> 30) * 2; printk(KERN_ALERT "%08lx -> *pde = %08lx:%08lx\n", page, p[1], p[0]); if (p[0] & 1) { - page = p[0] & PAGE_MASK; - address &= 0x3fffffff; - page = machine_to_phys(page); + mfn = (p[0] >> PAGE_SHIFT) | ((p[1] & 0x7) << 20); + page = mfn_to_pfn(mfn) << PAGE_SHIFT; p = (unsigned long *)__va(page); + address &= 0x3fffffff; p += (address >> 21) * 2; - printk(KERN_ALERT "%08lx -> *pme = %08lx:%08lx\n", page, p[1], p[0]); + printk(KERN_ALERT "%08lx -> *pme = %08lx:%08lx\n", + page, p[1], p[0]); #ifndef CONFIG_HIGHPTE if (p[0] & 1) { - page = p[0] & PAGE_MASK; - address &= 0x001fffff; - page = machine_to_phys(page); - p = (unsigned long *) __va(page); - p += (address >> 12) * 2; - printk(KERN_ALERT "%08lx -> *pte = %08lx:%08lx\n", page, p[1], p[0]); + mfn = (p[0] >> PAGE_SHIFT) | ((p[1] & 0x7) << 20); + page = mfn_to_pfn(mfn) << PAGE_SHIFT; + p = (unsigned long *) __va(page); + address &= 0x001fffff; + p += (address >> 12) * 2; + printk(KERN_ALERT "%08lx -> *pte = %08lx:%08lx\n", + page, p[1], p[0]); } #endif } -- 2.30.2